package com.openess.bigsearch.engine.index;

import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;

import com.openess.bigsearch.engine.BTree.util.ByteArrays;

/**
 * 算是整个索引文件的头文件，用于索引合并，只记录待合并的子索引数量
 * 
 * @author TuTu
 * 
 */
public class Segment {
	/**
	 * 保存的数据长度，包括：1.索引数量
	 */
	public static final int DATASIZE = 4;
	/**
	 * 当前有多少个索引，也代表下一个临时索引的版本号。0是主索引，所有索引的版本号必须是从0开始的连续数字
	 */
	private int version;
	private byte[] data;
	private RandomAccessFile rf;
	private FileChannel cf;

	/**
	 * 构造方法
	 * 
	 * @param filePath
	 * @throws IOException
	 */
	public Segment(String filePath) throws IOException {
		rf = new RandomAccessFile(filePath + "segment", "rw");
		cf = rf.getChannel();
		data = new byte[DATASIZE];
		// 没有必要区分读/写操作了，因为数据量很小，并且不管读/写都需要读取磁盘中的数据
		read();
	}

	public void close() throws IOException {
		if (cf != null) {
			cf.close();
		} else if (rf != null) {
			rf.close();
		}
	}

	public int getVersion() {
		return version;
	}

	/**
	 * 从磁盘中读取数据，目前的数据只包括：1.索引数量
	 * 
	 * @throws IOException
	 */
	public void read() throws IOException {
		// 如果没有数据可读取那么返回空
		if (cf.size() == 0) {
			return;
		}
		version = ByteArrays.getInt(data, 0);
		ByteBuffer buf = ByteBuffer.wrap(data);
		cf.write(buf, 0);
	}

	public final void setVersion(int version) {
		this.version = version;
	}

	/**
	 * 将待合并索引数量，写入磁盘
	 * 
	 * @throws IOException
	 */
	public void write() throws IOException {
		try {
			ByteArrays.putInt(version, data, 0);
			ByteBuffer buf = ByteBuffer.wrap(data);
			cf.write(buf, 0);
		} finally {
			cf.close();
			rf.close();
		}
	}
}
